#include <iostream>

using namespace std;

int main(int argc, char const *argv[])
{
  /* code */
  // Q1: 什么是地址？
  // 指针：一个保存其他变量位置的变量
  int n = 10; // 计算机是怎么把 n 放到内存的某一个位置的呢？
  // Mi: 8GB = 8*1024MB = 8*1024*1024KB = 8*1024*1024*1024 Byte
  // Mo: 16GB
  // 计算机是怎么管理这么多字节的？
  // vector<char> memory(8*1024*1024*1024, 0)
  // 0 1
  cout << &n << endl; // Q2: 什么是取地址操作符 &
  int m = 11;
  cout << &m << endl;

  char c1 = 'A';
  char c2 = 'B';
  char c3 = 'C';
  char c4 = 'D';
  char c5 = 'E';
  char c6 = 'F';

  cout << "-----------" << endl;
  cout << (void *)&c1 << endl;
  cout << (void *)&c2 << endl;
  cout << (void *)&c3 << endl;
  cout << (void *)&c4 << endl;
  cout << (void *)&c5 << endl;
  cout << (void *)&c6 << endl;

  // Q3. 如何保存变量的地址: 指针变量 (类型 *)
  // void * 只表示当前的内存位置，不表示任何类型信息。

  char * c3_address = &c3;
  int * m_address = &m;
  cout << m_address << endl;
  cout << &m << endl;
  cout << (void *)&c1 << endl;

  // 一个 double 占用多少字节？
  // 一个 bool 占用多少字节？
  // Mi: 8 1
  // Mo: 8 1

  // Q4. 指针能干什么用
  // 间接修改它指向的内容
  ++m; // 直接修改变量的内容
  cout << m << endl; // 12
  ++(*m_address); // 间接修改变量的内容, * 叫做指针的解引用操作符
  cout << m << endl; // 13
  return 0;
}
